let { SyncHook } = require('tapable')
const fs = require('fs')
const path = require('path')
let Complication = require('./Complication')
class Compiler {
  constructor(options) {
    this.options = options;
    this.hooks = {
      run: new SyncHook(),//开始启动编译 刚刚开始
      emit: new SyncHook(),//会在将要写入文件的时候触发
      done: new SyncHook()//将会在完成编译的时候触发 全部完成
    }
  }

  // 4.执行Compiler对象的run方法开始执行编译
  run(callback) {
    // 开始编译
    this.hooks.run.call();//触发run钩子函数
    this.complier((err, stats) => {
      console.log('compiler开始')
      this.hooks.emit.call()
      // 10.在确定好输出内容后，  根据配置确定输入的文件名和路径，把文件内容写到文件系统
      for (let filename in stats.assets) {
        let filePath = path.join(this.options.output.path, filename);
        fs.writeFileSync(filePath, stats.assets[filename], 'utf8');
      }

      callback(null, {
        toJson: () => stats
      });
    });
    this.hooks.done.call() // 编译后触发的钩子函数
    //监听入口的文件变化,如果文件变化了,重新再开始编译
    /*  Object.values(this.options.entry).forEach(entry=>{
       fs.watchFile(entry,()=>this.compile(callback));
     }); */
  }
  complier(callback) {
    let complication = new Complication(this.options)
    complication.build(callback)
  }
}

module.exports = Compiler
